#include "caskstatus.h"
#include <QThread>
#include<QDebug>

CaskStatus::CaskStatus(QWidget *parent)
    : QWidget{parent}
{

}

// CaskStatus::CaskStatus(const QJsonObject &functionDetails, QWidget *parent)
//     : QWidget{parent}
// {
//     QVBoxLayout *mainLayout = new QVBoxLayout(this);
//     mainLayout->setAlignment(Qt::AlignTop);  // 设置垂直方向的对齐方式为顶部对齐
//     qDebug() << "functionDetails:" << functionDetails << Qt::endl;


//     // 遍历 statusDetails，动态创建每个 Status 的 Flag1Status 控件
//     QJsonObject statusDetails = functionDetails["Status"].toObject();
//     for (auto it = statusDetails.begin(); it != statusDetails.end(); ++it) {
//         QString statusName = it.key();  // 获取 status1、status2 等的名称
//         QJsonObject Details = it.value().toObject();
//         if(statusName == "status2") continue;

//         // 创建 GroupBox 用于容纳 Flag 控件
//         QGroupBox *groupBox = new QGroupBox(statusName, this);  // 以状态名作为 groupBox 名称
//         groupBox->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);

//         // 遍历 flagDetails，根据 "flag1" 或 "flag2" 来动态创建控件
//         // 如果是 flag1, 就根据这个键的详细信息动态添加控件
//         if (Details.contains("flag1"))
//         {
//             QJsonObject flagDetails = Details["flag1"].toObject();
//             qDebug() << "flagDetails:" << flagDetails << Qt::endl;
//             Flag1Status *flag1StatusWidget = new Flag1Status(flagDetails, groupBox);
//             QVBoxLayout *groupLayout = new QVBoxLayout(groupBox);
//             groupLayout->addWidget(flag1StatusWidget);  // 将 flag1 控件添加到 groupBox 布局中
//         }

//         mainLayout->addWidget(groupBox);  // 将每个 groupBox 添加到主布局中
//     }


//     // 设置布局到当前 QWidget
//     mainLayout->setContentsMargins(0, 0, 0, 0);  // 可选，去除边距
//     setLayout(mainLayout);
// }
// // CaskStatus::CaskStatus(const QJsonObject &functionDetails, QWidget *parent)
// //     : QWidget{parent}
// // {

// //     // qDebug() << "[Constructor] currentThread() =" << QThread::currentThread();
// //     // // 这行打印 this 对象被设置（affinity）到哪个线程
// //     // qDebug() << "[Constructor] this->thread()    =" << this->thread();
// //     // qDebug() << "statusDetails:"<< functionDetails << Qt::endl;
// //     QGroupBox *groupBox = new QGroupBox("status", this);
// //     groupBox->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
// //     createCaskStatus(groupBox, functionDetails);

// //     // 创建 QVBoxLayout 并设置到当前 QWidget
// //     QVBoxLayout *layout = new QVBoxLayout(this);
// //     layout->addWidget(groupBox); // 将 groupBox 添加到布局
// //     layout->setContentsMargins(0, 0, 0, 0); // 可选，去除边距
// //     qDebug() << "CaskStatus";

// //     // 让 ModelControl 使用这个布局
// //     setLayout(layout);

// //     // 手动设置字段的值
// //     updateFieldValue("displacement", "100");
// //     updateFieldValue("velocity", "20.5");
// //     updateFieldValue("angle", "45");
// //     updateFieldValue("temperature", "70");

// // }
// CaskStatus::CaskStatus(const QJsonObject &functionDetails, const QString deviceID,QWidget *parent)
//     : QWidget{parent}
// {
//     QVBoxLayout *mainLayout = new QVBoxLayout(this);
//     mainLayout->setAlignment(Qt::AlignTop);

//     mDeviceID = deviceID;

//     QJsonObject statusDetails = functionDetails["Status"].toObject();

//     for (auto it = statusDetails.begin(); it != statusDetails.end(); ++it) {
//         QString categoryName = it.key();  // 比如“大类”名称，比如 "status", "Joint Status Information"
//         // if(categoryName == "Joint Status Information") continue;
//         QJsonObject categoryObj = it.value().toObject();

//         QGroupBox *categoryGroupBox = new QGroupBox(categoryName, this);
//         QVBoxLayout *categoryLayout = new QVBoxLayout(categoryGroupBox);

//         // 遍历 categoryObj，找到所有 flag1 或 flag2 的内容，并从中解析 label和lineedit
//         for (auto innerIt = categoryObj.begin(); innerIt != categoryObj.end(); ++innerIt) {
//             QJsonObject innerObj = innerIt.value().toObject();

//             // 以 flag1 为例
//             if (innerObj.contains("flag1")) {
//                 QJsonObject flag1Obj = innerObj["flag1"].toObject();

//                 // 你现有的 Flag1Status 能直接解析 flag1Obj 并生成 label+lineedit
//                 Flag1Status *flagWidget = new Flag1Status(flag1Obj, categoryGroupBox);
//                 categoryLayout->addWidget(flagWidget);

//                 //通信设置
//                 //QString dev = "ORS_Cask";

//                 currentDevice = mDeviceID;
//                 DeviceManager::instance().nodeFor(mDeviceID);
//                 auto node = DeviceManager::instance().nodeFor(currentDevice);
//                 flagWidget->attachToNode(node);
//             }
//             // 如果有flag2，类似处理
//             else if (innerObj.contains("flag2")) {
//                 QJsonObject flag2Obj = innerObj["flag2"].toObject();
//                 Flag2Status *flagWidget = new Flag2Status(flag2Obj, categoryGroupBox);
//                 Flag2StatusList.append(flagWidget);
//                 categoryLayout->addWidget(flagWidget);

//                 //通信设置
//                 //QString dev = "ORS_Cask";
//                 // currentDevice = mDeviceID;
//                 // DeviceManager::instance().nodeFor(mDeviceID);
//                 // auto node = DeviceManager::instance().nodeFor(currentDevice);
//                 // flagWidget->attachToNode(node);
//             }
//         }

//         mainLayout->addWidget(categoryGroupBox);
//     }
//     // for (Flag2Status* flagWidget : Flag2StatusList) {
//     //     // 调用其方法打印信息
//     //     qDebug() << "Label1: " << flagWidget->getLabel1();
//     //     qDebug() << "Label3: " << flagWidget->getLabel3();
//     //     qDebug() << "Line Edit 1: " << flagWidget->getLineEdit1()->text();
//     //     qDebug() << "Line Edit 2: " << flagWidget->getLineEdit2()->text();
//     //     //flagWidget->updateFieldValue();
//     // }
//     mainLayout->setContentsMargins(0, 0, 0, 0);
//     setLayout(mainLayout);
// }
CaskStatus::CaskStatus(const QJsonObject &functionDetails, const QString deviceID,QWidget *parent)
    : QWidget(parent)
{
        mDeviceID = deviceID;
    // ───── 0. 根布局 ─────
    QVBoxLayout *rootLayout = new QVBoxLayout(this);
    rootLayout->setContentsMargins(0, 0, 0, 0);
    rootLayout->setSpacing(12);
    rootLayout->setAlignment(Qt::AlignTop);

    QJsonObject statusDetails = functionDetails["Status"].toObject();

    for (auto it = statusDetails.begin(); it != statusDetails.end(); ++it) {
        QString categoryName = it.key();                 // e.g. "Joint Status Information"
        QJsonObject categoryObj = it.value().toObject();

        // ───── 每个类一个独立 container ─────
        QFrame *container = new QFrame(this);
        container->setObjectName("statusFrame");
        container->setFrameShape(QFrame::NoFrame);
        container->setStyleSheet(R"(
            QFrame#statusFrame {
                background-color: #11213A;
                border: 1px solid #3E4C61;
                border-radius: 8px;
            }
        )");

        QVBoxLayout *containerLayout = new QVBoxLayout(container);
        containerLayout->setContentsMargins(12, 12, 12, 12);
        containerLayout->setSpacing(12);

        // ───── 顶部标题栏 ─────
        QWidget *headerWidget = new QWidget(container);
        QHBoxLayout *headerLayout = new QHBoxLayout(headerWidget);
        headerLayout->setContentsMargins(0, 0, 0, 0);
        headerLayout->setSpacing(6);

        QLabel *iconLabel = new QLabel(headerWidget);
        // iconLabel->setPixmap(QIcon(":/img/connect.png").pixmap(18, 18));
        if (categoryName.contains("Joint Status Information")) {
            iconLabel->setPixmap(QIcon(":/img/chart.png").pixmap(18, 18));
        } else if (categoryName.contains("TCP Status Information")) {
            iconLabel->setPixmap(QIcon(":/img/location.png").pixmap(18, 18));
        } else if (categoryName.contains("status")) {
            iconLabel->setPixmap(QIcon(":/img/chart.png").pixmap(18, 18));
        } else {
            iconLabel->setPixmap(QIcon(":/img/chart.png").pixmap(18, 18)); // 默认
        }

        QLabel *titleLabel = new QLabel(categoryName, headerWidget);
        titleLabel->setStyleSheet("color:#F0B532; font-weight:bold; font-size:17px;");

        headerLayout->addWidget(iconLabel);
        headerLayout->addWidget(titleLabel);
        headerLayout->addStretch();

        containerLayout->addWidget(headerWidget);

        // ───── 内容 groupBox ─────
        QGroupBox *categoryGroupBox = new QGroupBox(container);
        categoryGroupBox->setTitle("");
        categoryGroupBox->setFlat(true);
        categoryGroupBox->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
        categoryGroupBox->setStyleSheet(R"(
            QGroupBox {
                border: none;
                margin-top: 0px;
            }
        )");

        QVBoxLayout *categoryLayout = new QVBoxLayout(categoryGroupBox);

        categoryLayout->setSpacing(16);

        for (auto innerIt = categoryObj.begin(); innerIt != categoryObj.end(); ++innerIt) {
            QJsonObject innerObj = innerIt.value().toObject();
            QWidget *flagWidget = nullptr;

            if (innerObj.contains("flag1")) {
                QJsonObject flag1Obj = innerObj["flag1"].toObject();
                auto *widget = new Flag1Status(flag1Obj, categoryGroupBox);
                categoryLayout->addWidget(widget);

                //8.01
                currentDevice = mDeviceID;
                DeviceManager::instance().nodeFor(mDeviceID);
                auto node = DeviceManager::instance().nodeFor(currentDevice);
                widget->attachToNode(node);


            } else if (innerObj.contains("flag2")) {
                QJsonObject flag2Obj = innerObj["flag2"].toObject();
                auto *widget = new Flag2Status(flag2Obj, categoryGroupBox);
                Flag2StatusList.append(widget);
                categoryLayout->addWidget(widget);
                //8.01
                currentDevice = mDeviceID;
                DeviceManager::instance().nodeFor(mDeviceID);
                auto node = DeviceManager::instance().nodeFor(currentDevice);
                widget->attachToNode(node);
            }

            if (flagWidget)
            {
                // categoryLayout->addWidget(flagWidget);
                // currentDevice = mDeviceID;
                // DeviceManager::instance().nodeFor(mDeviceID);
                // auto node = DeviceManager::instance().nodeFor(currentDevice);
                // flagWidget->attachToNode(node);
            }
        }

        containerLayout->addWidget(categoryGroupBox);
        rootLayout->addWidget(container);
    }
}


CaskStatus::~CaskStatus()
{
    // currentDevice = mDeviceID;
    //  DeviceManager::instance().removeNode(mDeviceID);
    qDebug() << "CaskStatus in XIGou";
    //delete mCaskStatu;
}

void CaskStatus::createCaskStatus(QGroupBox *groupBox, const QJsonObject &functionDetails)
{
    QJsonObject statusDetails = functionDetails["Status"].toObject();
    qDebug() << "statusDetails:" << statusDetails << Qt::endl;

    QVBoxLayout *mainLayout = new QVBoxLayout(groupBox);
    mainLayout->setAlignment(Qt::AlignTop);  // 设置垂直方向的对齐方式为顶部对齐

    for (auto it = statusDetails.begin(); it != statusDetails.end(); ++it)
    {
        QString fieldName = it.key();

        QWidget *fieldWidget = new QWidget(groupBox);
        QHBoxLayout *fieldLayout = new QHBoxLayout(fieldWidget);
        fieldWidget->setLayout(fieldLayout);

        // 左侧弹簧（设置为扩展，确保控件水平居中）
        fieldLayout->addSpacerItem(new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum));

        // 创建 QLabel 并设置字体
        QLabel *label = new QLabel(fieldName + "  :", fieldWidget);
        label->setFixedWidth(150);  // 设置标签的宽度
        QFont labelFont = label->font();
        // labelFont.setPointSize(12);  // 设置字体大小
        label->setFont(labelFont);
        label->setAlignment(Qt::AlignCenter);  // 设置标签文本居中
        fieldLayout->addWidget(label);

        // 创建 QLineEdit 并设置字体与宽度
        QLineEdit *lineEdit = new QLineEdit(fieldWidget);
        lineEdit->setObjectName(fieldName);
        // lineEdit->setFixedWidth(200);  // 设置输入框宽度
        QFont lineEditFont = lineEdit->font();
        // lineEditFont.setPointSize(12);  // 设置字体大小
        lineEdit->setFont(lineEditFont);
        fieldLayout->addWidget(lineEdit);

        // 存储 QLineEdit 到 Map 中，方便后续访问
        fieldLineEdits.insert(fieldName, lineEdit);

        // 右侧弹簧（确保控件水平居中）
        fieldLayout->addSpacerItem(new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum));

        mainLayout->addWidget(fieldWidget);
    }

    // groupBox->setLayout(mainLayout);
}

void CaskStatus::updateFieldValue(const QString &fieldName, const QString &newValue)
{
    if (fieldLineEdits.contains(fieldName)) {
        fieldLineEdits[fieldName]->setText(newValue);  // 更新 QLineEdit 的值
    } else {
        qWarning() << "Field name not found: " << fieldName;
    }
}




void CaskStatus::subEventCallBack(const QString& content)
{
    // 解析原始 JSON
    //QString rawJson = QString::fromStdString(msg.content());
    QString rawJson = content;
    QJsonParseError parseError;
    QJsonDocument doc = QJsonDocument::fromJson(rawJson.toUtf8(), &parseError);

    QString key = "unknown", value = "";

    {
        QMutexLocker locker(&mCaskStatuMutex);
        if (parseError.error == QJsonParseError::NoError && doc.isObject()) {
            QJsonObject obj = doc.object();
            if      (obj.contains("event"))   { key = "event";   value = obj["event"].toString(); }
            else if (obj.contains("warning")) { key = "warning"; value = obj["warning"].toString(); }
            else if (obj.contains("error"))   { key = "error";   value = obj["error"].toString(); }
            else if (obj.contains("fatal"))   { key = "fatal";   value = obj["fatal"].toString(); }
            else if (obj.contains("command")) { key = "command"; value = obj["command"].toString(); }
            else {
                qWarning() << "收到未知字段的 JSON：" << rawJson;
            }
            value = "("+mDeviceID+") "+value;
        } else {
            qWarning() << "JSON 解析失败：" << parseError.errorString();
        }
    }

    qDebug() << "解析到：" << key << "=" << value;
    // 用 QStringList 传递更加安全、方便
    emit upSubEvent(QStringList{key, value});
}


void CaskStatus::attachToNode(QSharedPointer<DeviceNode> node)
{
    if (m_node) {
        disconnect(m_node.data(), &DeviceNode::cmdReceived,
                   this, &CaskStatus::onDataReceived);
        disconnect(m_node.data(), &DeviceNode::eventReceived,
                   this, &CaskStatus::onEventReceived);
    }
    m_node = node;
    if (m_node) {
        connect(m_node.data(), &DeviceNode::cmdReceived,
                this, &CaskStatus::onDataReceived);
        connect(m_node.data(), &DeviceNode::eventReceived,
                this, &CaskStatus::onEventReceived);
    }
}


void CaskStatus::onEventReceived(const QString& content)
{
    //m_eventLabel->setText("Event: " + content);
    qDebug()<<"CaskStatus Received Event "<<content<<Qt::endl;
    subEventCallBack(content);
    eventStatuCallback(content);
}

void CaskStatus::eventStatuCallback(const QString &content)
{
    //qDebug()<<"In eventStatuCallback ~~~~~~"<<Qt::endl;
    //QString rawJson = QString::fromStdString(msg.content());  // 原始 JSON 字符串
    QString rawJson = content;
    //std::cout<<"SwitchStatu receive event :"<<msg.content()<<std::endl;
    QString a, b;

    // 解析 JSON
    {
        QMutexLocker locker(&mCaskStatuMutex);
        QJsonParseError parseError;
        QJsonDocument doc = QJsonDocument::fromJson(rawJson.toUtf8(), &parseError);

        if (parseError.error == QJsonParseError::NoError && doc.isObject()) {
            QJsonObject obj = doc.object();

            // 提取 "event" 字段的键值对
            if (obj.contains("event")) {
                a = "event";  // 键名固定为 "event"
                b = obj["event"].toString();  // 提取值部分

            }
            else if(obj.contains("warning"))
            {
                a = "waring";
                b = obj["warning"].toString();  // 提取值部分

            }
            else if(obj.contains("error"))
            {
                a = "error";
                b = obj["error"].toString();  // 提取值部分
            }
            else if(obj.contains("fatal"))
            {
                a = "fatal";
                b = obj["fatal"].toString();  // 提取值部分
            }
            else if(obj.contains("command"))
            {
                a = "command";
                b = obj["command"].toString();
            }

            //std::cout<<"switch b="<<b.toStdString()<<std::endl;

            exEventMsg[0] = a;
            exEventMsg[1] = b;

        } else {
            qWarning() << "JSON11 解析失败：" << parseError.errorString();
        }
    }
    //emit upSubEvent(exEventMsg);

    if(exEventMsg[1]=="State switched to:root.enable.halt")
    {
        emit colorChanged("yellow"); // 黄色，作为例子
        QMetaObject::invokeMethod(
            this,                       // 目标对象（通常是主窗口）
            "slotHaltUi",                 // 槽函数名
            Qt::QueuedConnection        // 确保在主线程执行
            );

    }
    else if(exEventMsg[1]=="State switched to:root.enable.command")
    {
        emit colorChanged("green");  // 绿色
        QMetaObject::invokeMethod(
            this,                       // 目标对象（通常是主窗口）
            "slotCommandUi",                 // 槽函数名
            Qt::QueuedConnection        // 确保在主线程执行
            );

    }
    else if(exEventMsg[1]=="State switched to:root.ready")
    {
        emit colorChanged("gray");    // 灰色
        QMetaObject::invokeMethod(
            this,                       // 目标对象（通常是主窗口）
            "slotReadyUi",                 // 槽函数名
            Qt::QueuedConnection        // 确保在主线程执行
            );
    }
}

// void CaskStatus::onDataReceived(const QString& content)
// {
//     //qDebug() << "CaskStatus Node Received Statu " << content << Qt::endl;

//     // 解析JSON字符串
//     QJsonDocument doc = QJsonDocument::fromJson(content.toUtf8());

//     // 判断是否成功解析
//     if (doc.isObject()) {
//         QJsonObject obj = doc.object();

//         // 遍历JSON对象的所有键值对
//         QJsonObject::const_iterator iter = obj.constBegin();
//         QString key;
//         QJsonValue value;
//         QString valueF;
//         while (iter != obj.constEnd()) {
//             // 打印每个键和值
//             key = iter.key();
//             value = iter.value();
//             QString valueF = " ";
//             // 根据值的类型打印
//             if (value.isDouble()) {
//                 //qDebug() << key << ": " << value.toDouble();
//                 valueF = QString::number(value.toDouble());
//             } else if (value.isBool()) {

//                 valueF = value.toBool() ? "TRUE" : "FALSE";
//             } else if (value.isString()) {
//                 //qDebug() << key << ": " << value.toString();
//                 valueF = value.toString();
//             } else {
//                 qDebug() << key << ": unknown type";
//             }

//             QMetaObject::invokeMethod(this, [this, key, valueF]() {
//                 updateFieldValue(key, valueF);
//             }, Qt::QueuedConnection);

//             // 前进到下一个键值对
//             ++iter;
//         }
//     } else {
//         qDebug() << "Failed to parse JSON." << Qt::endl;
//     }
// }

void CaskStatus::onDataReceived(const QString& content)
{
    //qDebug() << "CaskStatus Node Received Statu " << content << Qt::endl;

    // 解析JSON字符串
    QJsonDocument doc = QJsonDocument::fromJson(content.toUtf8());

    // 判断是否成功解析
    if (doc.isObject()) {
        QJsonObject obj = doc.object();

        // 遍历JSON对象的所有键值对
        QJsonObject::const_iterator iter = obj.constBegin();
        QString key;
        QJsonValue value;
        QString valueF;
        while (iter != obj.constEnd()) {
            // 打印每个键和值
            key = iter.key();
            value = iter.value();
            valueF = " ";
            // 根据值的类型
            if(value.isArray())
            {
                QJsonArray jsonArray = value.toArray();
                int i=1;
                QString nameX;
                for (const auto &value : jsonArray) {
                    //nameArray.push_back(value.toDouble());
                    valueF = QString::number(value.toDouble());
                    nameX = key+QString::number(i);
                    //initMsg.insert(nameX,valueF);
                    onceMsg[nameX] = valueF;
                    // QMetaObject::invokeMethod(this, [this, nameX, valueF]() {
                    //     updateFieldValue(nameX, valueF);
                    // }, Qt::QueuedConnection);
                    i++;
                }
                ++iter;
                continue;
            }

            if (value.isDouble()) {
                //qDebug() << key << ": " << value.toDouble();
                valueF = QString::number(value.toDouble());
            } else if (value.isBool()) {

                valueF = value.toBool() ? "TRUE" : "FALSE";
            } else if (value.isString()) {
                //qDebug() << key << ": " << value.toString();
                valueF = value.toString();
            } else {
                qDebug() << key << ": unknown type";
            }

            // QMetaObject::invokeMethod(this, [this, key, valueF]() {
            //     updateFieldValue(key, valueF);
            // }, Qt::QueuedConnection);
            onceMsg[key] = valueF;
            //initMsg.insert(key,valueF);
            // 前进到下一个键值对
            ++iter;
        }
    } else {
        qDebug() << "Failed to parse JSON." << Qt::endl;
    }


    //更新界面
    for (Flag2Status* flagWidget : Flag2StatusList) {
        // 调用其方法打印信息
        // qDebug() << "Label1: " << flagWidget->getLabel1();
        // qDebug() << "Label3: " << flagWidget->getLabel3();
        // qDebug() << "Line Edit 1: " << flagWidget->getLineEdit1()->text();
        // qDebug() << "Line Edit 2: " << flagWidget->getLineEdit2()->text();
        for(auto it = onceMsg.constBegin();it != onceMsg.constEnd();it++)
        {
            flagWidget->updateFieldValue(it.key(),it.value());
        }
    }


    //更新状态颜色
    QString nowColor = onceMsg.value("fsmState");
    if(nowColor != lastSteteColor)
    {
        upStateColor();
        lastSteteColor = nowColor;
    }

}

void CaskStatus::upStateColor()
{
    QString deviceStatus = onceMsg.value("fsmState");
    //qDebug()<<"SwitchStatu , deviceStatus = "<<deviceStatus<<Qt::endl;
    if(deviceStatus == "root.enable.halt")
    {
        emit colorChanged("yellow"); // 黄色，作为例子
        QMetaObject::invokeMethod(
            this,                       // 目标对象（通常是主窗口）
            "slotHaltUi",                 // 槽函数名
            Qt::QueuedConnection        // 确保在主线程执行
            );
    }
    else if(deviceStatus=="root.enable.command")
    {
        emit colorChanged("green");  // 绿色
        QMetaObject::invokeMethod(
            this,                       // 目标对象（通常是主窗口）
            "slotCommandUi",                 // 槽函数名
            Qt::QueuedConnection        // 确保在主线程执行
            );

    }
    else if(deviceStatus=="root.ready")
    {
        emit colorChanged("gray");    // 灰色
        QMetaObject::invokeMethod(
            this,                       // 目标对象（通常是主窗口）
            "slotReadyUi",                 // 槽函数名
            Qt::QueuedConnection        // 确保在主线程执行
            );

    }

}

// void CaskStatus::subCallBack(const CnpMsg &msg)
// {

//     SensorData localData;
//     parseSensorData(QString::fromStdString(msg.content()), localData);

//     // 2) 把写 mData 和更新 UI 都排到主线程
//     QMetaObject::invokeMethod(this, [this, localData]() {
//         // —— 写成员 ——
//         mData = localData;

//         // —— 更新界面 ——
//         updateFieldValue("displacement", QString::number(mData.displacement));
//         updateFieldValue("velocity",     QString::number(mData.velocity));
//         updateFieldValue("hinge",        QString::number(mData.hinge));
//         QString lock = (mData.lockState == 0 ? "FALSE" : "TRUE");
//         updateFieldValue("lock", lock);
//     }, Qt::QueuedConnection);
// }


// void CaskStatus::parseSensorData(const QString &jsonString, SensorData &outData)
// {
//     //     qDebug() << "[parseSensorData] this =" << this;
//     // qDebug() << "[parseSensorData] &outData =" << &outData;
//     // qDebug() << "[parseSensorData] &mData    =" << &mData;
//     // 1. QString 转 QByteArray
//     QByteArray jsonData = jsonString.toUtf8();
//     // 2. 解析
//     QJsonParseError err;
//     QJsonDocument doc = QJsonDocument::fromJson(jsonData, &err);
//     if (err.error != QJsonParseError::NoError) {
//         qWarning() << "JSON parse error:" << err.errorString();
//         return ;
//     }
//     if (!doc.isObject()) {
//         qWarning() << "JSON is not an object";
//         return ;
//     }
//     // 3. 拆字段
//     QJsonObject obj = doc.object();
//     if (!obj.contains("displacement") ||
//         !obj.contains("velocity")     ||
//         !obj.contains("hinge")        ||
//         !obj.contains("lock")) {
//         qWarning() << "Missing expected fields in JSON";
//         return ;
//     }
//     outData.displacement = obj.value("displacement").toDouble();
//     outData.velocity     = obj.value("velocity").toDouble();
//     outData.hinge        = obj.value("hinge").toDouble();
//     outData.lockState    = obj.value("lock").toInt();
//     //return true;
// }

